package locacao.integracao.dao.pstPostgreSQL;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;

import locacao.integracao.dao.PessoaDAO;
import locacao.negocio.to.PessoaTO;
import locacao.util.LocacaoUtil;

public class PessoaPgsqlDAO implements PessoaDAO {

    private ArrayList<PessoaTO> pessoas;

    public PessoaPgsqlDAO(){
	   setPessoas(new ArrayList<PessoaTO>());
    }


    public void addOrUpdatePessoa(PessoaTO pessoa) {
    	Connection conn = null;
    	CallableStatement spManterPessoa = null;

    	try {        	
          String sql = "{call locacao.manter_pessoa(?,?,?,?,?)}";
          conn = ConnectionRentACar.getInstance().getConnection();
          
          spManterPessoa = conn.prepareCall(sql);
          
          spManterPessoa.setInt(1, pessoa.getIdPessoa());
          spManterPessoa.setString(2, pessoa.getNome());
          spManterPessoa.setString(3, pessoa.getEndereco());
          spManterPessoa.setString(4, pessoa.getTelefone());
          spManterPessoa.setDate(5, (Date) pessoa.getDataNascimento());
          
          spManterPessoa.execute();
        } catch (Exception e) {
          System.out.println(e.getMessage());
        } finally {
          try {
            if (spManterPessoa != null)
            	spManterPessoa.close();

          } catch (SQLException e) {
            System.out.println(e.getMessage());
          }
        }
    }

    /**
     *

    /**
     * @param pessoa
     */
    public void excludePessoa( PessoaTO pessoa )  {
    	Connection conn = null;
    	CallableStatement spDeletePessoa = null;

    	try {        	
          String sql = "{call locacao.delete_pessoa(?)}";
          conn = ConnectionRentACar.getInstance().getConnection();
          
          spDeletePessoa = conn.prepareCall(sql);
          
          spDeletePessoa.setInt(1, pessoa.getIdPessoa());         
          
          spDeletePessoa.execute();
        } catch (Exception e) {
          System.out.println(e.getMessage());
        } finally {
          try {
            if (spDeletePessoa != null)
            	spDeletePessoa.close();

          } catch (SQLException e) {
            System.out.println(e.getMessage());
          }
        }
    }


  
    /**
     * @return
     */
    public String[] findPessoaById(Integer id){
    	 Connection conn = null;
    	 Statement stmt = null;
    	 ResultSet rSet = null;
    	 String[] info = null;

    	 String sql = "SELECT  idpessoa, nome, endereco, telefone, dtnasc ";
    	 sql += " FROM locacao.pessoa WHERE idpessoa =  " + id;

    	 try {
    		 conn = ConnectionRentACar.getInstance().getConnection();
    		 stmt = conn.createStatement();
    		 rSet = stmt.executeQuery(sql);

    		 if (rSet != null) {    			 
    			 while (rSet.next()) {
    				 
    				info = new String[pessoas.size()];
    	    		   info[0] = rSet.getInt("idpessoa") 
    	       		   + " - " + rSet.getString("nome")
    	       		   + " - " + rSet.getString("endereco")
    	       		   + " - " + rSet.getString("telefone")
    	       		   + " - " + rSet.getDate("dtnasc");    	    		   
    			 }    			 
    		 }
			 return info;
			 
    	 } catch (Exception e) {
    		 System.out.println(e.getMessage());
    		 return null;
    	 } finally {
    		 try {
    			 if (rSet != null)
    				 rSet.close();
    			 if (stmt != null)
    				 stmt.close();
    		 } catch (SQLException e) {
    			 System.out.println(e.getMessage());
    		 }
    	 }
    }

    
    /**
     * @return
     */
    public String[] getInfoPessoas()
    {
    	 PessoaTO pessoa;
         pessoas = getPessoas();
         String[] info = new String[pessoas.size()];
         Iterator iteratorPessoas;
         iteratorPessoas = pessoas.iterator();
         int i=0;
         while ( iteratorPessoas.hasNext() )
         {
             pessoa = (PessoaTO) iteratorPessoas.next();
             info[i] = pessoa.getIdPessoa() 
             		+ " - " + pessoa.getNome() 
             		+ " - " + LocacaoUtil.formataDataStr(pessoa.getDataNascimento())
             		+ " - " + pessoa.getEndereco()
             		+ " - " + pessoa.getTelefone();
             i++;
         }
         return info;
    }


    /**
     * @return
     */
    public ArrayList<PessoaTO> getPessoas() {
    	 Connection conn = null;
    	 Statement stmt = null;
    	 ResultSet rSet = null;
    	 PessoaTO pessoa = null;

    	 String sql = "SELECT  idpessoa, nome, endereco, telefone, dtnasc ";
    	 sql += " FROM locacao.pessoa ORDER BY idpessoa";

    	 try {
    		 conn = ConnectionRentACar.getInstance().getConnection();
    		 stmt = conn.createStatement();
    		 rSet = stmt.executeQuery(sql);

    		 if (rSet != null) {
    			 pessoas = new ArrayList();
    			 while (rSet.next()) {
    				 
    				 pessoa = new PessoaTO();
    				 
    				 pessoa.setIdPessoa(rSet.getInt("idpessoa"));
    				 pessoa.setNome(rSet.getString("nome"));
    				 pessoa.setEndereco(rSet.getString("endereco"));
    				 pessoa.setTelefone(rSet.getString("telefone"));
    				 pessoa.setDataNascimento(rSet.getDate("dtnasc"));
    				 
    				 pessoas.add(pessoa);
    			 }
    		 }
    	 } catch (Exception e) {
    		 System.out.println(e.getMessage());
    	 } finally {
    		 try {
    			 if (rSet != null)
    				 rSet.close();
    			 if (stmt != null)
    				 stmt.close();
    		 } catch (SQLException e) {
    			 System.out.println(e.getMessage());
    		 }
    	 }
    	 return pessoas;
    }

    private void setPessoas(ArrayList<PessoaTO> pessoas) {
    	this.pessoas = pessoas;
    }
    
}
